/* 
	# 原型概念： js给每个构造函数分配的公共空间
	# 原型好处： 减少内存占用
	# 原型链概念： 多个原型的集合
	# 原型链特性： 当调用对象的属性、方法时，
	先自身找，找不到,上原型链找，
	一直找到顶级也就是Object构造函数的原型
	找到了直接用
	找不到:属性-undefined,方法-报错 
*/


/* 
	function 构造函数名() {// 1 构造函数推荐大驼峰
			// 2 this === 实例化对象 obj === 原型方法

			// 普通
			this.键 = 值

			// 3 不能写return  原始类型无意义，对象类型构造函数白写
	}
	// 原型
	构造函数名.prototype.键 = 值
	// 静态
	构造函数名.键 = 值

*/
//构造函数的写法
//
function Fn1(a, b) {
	//给实例化对象加
	this.a = a
	this.b = b
}
//公共空间加
Fn1.prototype.c = 3
Fn1.prototype.add = function () {
	console.log('add')
}
//构造函数本身加
Fn1.d = 4
Fn1.sub = function () {
	console.log('sub')
}
//ES6 class 写法
class Fn2 {
	constructor(a, b) {

		this.a = a
		this.b = b
		this.f1 = function () {
			console.log('f1')
		}
	}
	//只能给公共空间加方法
	f2() {
		console.log('f2')
	}

	//给构造函数加
	static c = 3
	static f3 = function () {
		console.log('f3')
	}
}
Fn2.prototype.a1 = 4
Fn2.a2 = 5

console.log(new Fn1())
console.log(new Fn2())